package hongcheng.code_generator.templet.freemarker;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import hongcheng.code_generator.exception.CustomException;
import hongcheng.code_generator.templet.ITemplet;


/**
 * 	Freemarker模板
 * */
public class FreemarkerTemplet implements ITemplet {
	
	/**
	 * 	Freemarker 的配置类
	 * */
	private Configuration configuration;
	/**
	 * 	文件名
	 * */
	private String fileName;
	
	/**
	 * 	构造函数
	 * */
	public FreemarkerTemplet(Configuration configuration,String fileName) {
		this.configuration = configuration;
		this.fileName = fileName;
	}
	
	
	/**
	 * 	处理数据和模板，生成内容
	 * 	@param dataMap 绑定的参数，此Map中的参数会替换模板中的变量
	 * 	@param writer 输出
	 * */
	@Override
	public void process(Map<?, ?> dataMap, Writer writer) {
		try {
			Template template = this.configuration.getTemplate(fileName);
			template.process(dataMap, writer);
		} catch (TemplateException | IOException e) {
			CustomException customException = new CustomException("获取Freemarker模板对象错误");
			customException.addSuppressed(e);
			throw customException;
		}
	}
	
	/**
	 * 	处理数据和模板，生成内容
	 * 	@param dataMap 绑定的参数，此Map中的参数会替换模板中的变量
	 * 	@param writer 输出
	 * */
	@Override
	public void process(Map<?, ?> dataMap, OutputStream out) {
		try {
			Template template = this.configuration.getTemplate(fileName);
			template.process(dataMap, new OutputStreamWriter(out));
		} catch (TemplateException | IOException e) {
			CustomException customException = new CustomException("获取Freemarker模板对象错误");
			customException.addSuppressed(e);
			throw customException;
		}
	}
	
	/**
	 * 	处理数据和模板，生成内容
	 *	@param dataMap 绑定的参数，此Map中的参数会替换模板中的变量
	 * 	@param writer 输出
	 * */
	@Override
	public void process(Map<?, ?> dataMap, File file) {
		try {
			Template template = this.configuration.getTemplate(fileName);
			template.process(dataMap, new FileWriter(file));
		} catch (TemplateException | IOException e) {
			CustomException customException = new CustomException("获取Freemarker模板对象错误");
			customException.addSuppressed(e);
			throw customException;
		}
	}
	
	/**
	 * 	处理数据和模板，生成内容
	 *	@param dataMap 绑定的参数，此Map中的参数会替换模板中的变量
	 * 	@param filePath 文件绝对路径
	 * */
	@Override
	public void process(Map<?, ?> dataMap, String filePath) {
		this.process(dataMap, new File(filePath));
	}
	
	
	/**
	 * 	处理数据和模板，生成内容
	 *	@param dataMap 绑定的参数，此Map中的参数会替换模板中的变量
	 * 	@return 生成的内容字符串
	 * */
	@Override
	public String render(Map<?, ?> dataMap) {
		try {
			Template template = this.configuration.getTemplate(fileName);
			StringWriter writer = new StringWriter();
			template.process(dataMap, writer);
			return writer.toString();
		} catch (TemplateException | IOException e) {
			CustomException customException = new CustomException("获取Freemarker模板对象错误");
			customException.addSuppressed(e);
			throw customException;
		}
	}
}
